package business.database.maescorp;


import java.util.HashMap;

import groovy.sql.Sql;
import org.apache.log4j.Logger;


/**
 * Factoria abstracta para los DAO de maescorp
 * @author Administrador
 *
 */
public class AbsMaescorpDAOFactory {

	private static AbsMaescorpDAOFactory _instance;
	/**
	* Objeto para bloquear y permitir un singleton threadsafe
	*/
	private static Object syncObject_ = new Object();
	private Logger _log;
	/**
	 * Este es el objeto que se encarga de acceder a la base de datos SQLite
	 */
	//private def Sql sqlmaescorp;
	private HashMap<Integer,Sql> sqlmaescorpPool;
	
	
	/**
	 * TODO: hacer thread safe
	 * @return instancia unica
	 */
	public static AbsMaescorpDAOFactory getInstance() {
		
				if (_instance == null) {
			
						  synchronized(syncObject_) {
			
							if (_instance == null) {
							   _instance =  new AbsMaescorpDAOFactory();
							}
			
						  }
			
						}
						return _instance;
	}
	
	private AbsMaescorpDAOFactory() {
		_log = Logger.getLogger("AbsMaescorpDAOFactory");
		sqlmaescorpPool = new HashMap<Long,Sql>();
	}
	
	/**
	 * Cambia la ruta de la base de datos de sqlite
	 * Si no existe se crea un nuevo fichero con la estructura
	 * @param path
	 */
	public boolean setDB(Integer id, String path) {
		
	 boolean ok = false
	  
		def f = new File(path)
		ok = f.exists()
		if (ok) {
			close(id)
			if (!sqlmaescorpPool.containsKey(id)) {
				Sql sqlmaescorp = Sql.newInstance("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=" + path, "",
				"", "sun.jdbc.odbc.JdbcOdbcDriver") 
				sqlmaescorpPool.put(id,sqlmaescorp);
			}
		} else _log.error "La ruta de Maescorp: ${path}, es incorrecta"
		
		return ok
	}
	
	/**
	* Cierra maescorp
	*/
	public boolean close(Integer id) {
		boolean ok = false;
	    try {
			if (sqlmaescorpPool.containsKey(id)) {
				sqlmaescorpPool.get(id).close();
				sqlmaescorpPool.remove(id);
			}
			ok = true;
		} catch (Exception e) {
			_log.error "Error al cerrar sqlmaescorp. ${e.getMessage()}"
		}
		return ok;
	}
	
	/**
	* Cierra todas las conexiones que hayan podido quedar
	*/
   public void closeAll() {
	  sqlmaescorpPool.keySet().each { id ->
		   try {
				sqlmaescorpPool.get(id).close();
			   
		   } catch (Exception e) {
			   
		   }
	   }
	   _instance = null;
   }
	
	/**
	* Inicia transaccion en sqlite
	*/
	 public void startTransaction(Integer id) { sqlmaescorpPool.get(id).execute("BEGIN TRANSACTION");}
	 
		 
	 /**
	  * finaliza transaccion en sqlite. Equivalente a hacer un COMMIT
	  */
	 public void endTransaction(Integer id) { sqlmaescorpPool.get(id).execute("END TRANSACTION");}
	 /**
	  * Hace un rollback sobre la transaccion abierta
	  */
	 public void rollback(Integer id) { sqlmaescorpPool.get(id).execute("ROLLBACK TRANSACTION");}
	 

	public MaescorpDAO getMaescorpDAO(Integer id) {
		return new MaescorpDAO(sqlmaescorpPool.get(id));
	}
	
	
	
		
	
}
